/**
 * 在ts利民  对复杂类型进行约束的方法 有三个。
 *      对象字面量
 *      类
 *      接口（最常用）
 */

/**
 * 接口：
 *      固定语法：用来约束对象的构成的。
 * 、    interface 接口名称{
 *          属性名：类型
 *          ...，
 *          方法名：
 *       }
 *       
 *       在写接口的时候  建议使用大写I开头
 */

//写成一个模块
export {}

//定义接口   经常用来约束
interface IPerson{
    //定义属性和类型
    name:string;
    age:number;
    sex:"男" | "女" ;
    // 定义方法
    say:(name:string) => void;
}
//调用接口
let p:IPerson = {
    name: "张三",
    age: 18,
    sex: "男",
    say(name: string) {
        console.log(`你好，我是${name}`);
        return `你好，我是${name}`;
    }
}


/**
 * 接口中如果允许某些属性可选，可以使用 ? 修饰
 * 
 */
interface ICar{
    name:string;
    //加上？表示age属性可以没有
    age ? :number;
}
let a:ICar = {
    name: "奔驰",
    //age属性可以没有
}

//可选？在函数中的使用：
function fn(a:number, b?:number) {
    //如果b没有传值，返回a，如果有传值返回 a+b
    return b ? a + b : a;  //
}
fn(99);

//可选参数一定要放在必选参数后面
// function fn2(a?:number, b:number = 10) {
//     return a+b;
// }